package org.javahispano.javacup.tacticas_aceptadas.Moyatzo.MoyatzoBraves;

import org.javahispano.javacup.modelo.*;

public class InstruccionGolpeoBalon {

	// Enumerado con los posibles tipos de acci�n con bal�n.
	public enum AccionConBalon { NINGUNA, PASE, DISPARO, AVANZAR_CON_BALON, DESPEJE };
	
	// Acci�n a realizar en el golpeo de bal�n.
	private AccionConBalon _accion;
	
	// Posici�n destino del bal�n tras el golpeo.
	private Posicion _pos_destino;
	
	// Determina el �ngulo vertical de un golpeo de bal�n.
	private double _d_angulo;
	
	// Determina el �ngulo con el que se avanza controlando el bal�n.
	private double _d_angulo_avance;
	
	// Determina la fuerza al golpear el bal�n en un despeje.
	private double _d_fuerza;
	
	// Constructora.
	public InstruccionGolpeoBalon()
	{
		_accion = AccionConBalon.NINGUNA;
		_pos_destino = new Posicion();
		_d_angulo = 0.0;
		_d_angulo_avance = 0.0;
	}
	
	// Retorna la posici�n de destino del bal�n tras el golpeo.
	public Posicion getPosicionDestino()
	{
		return _pos_destino;
	}

	// Retorna el tipo de acci�n a realizar con el bal�n.
	public AccionConBalon getAccionConBalon()
	{
		return _accion;
	}
	
	// Retorna el �ngulo vertical de un golpeo de bal�n.
	public double getAnguloVertical()
	{
		return _d_angulo;
	}
	
	// Retorna el �ngulo de direcci�n para avanzar con el bal�n.
	public double getAnguloAvanceConBalon()
	{
		return _d_angulo_avance;
	}

	// Retorna la fuerza con la que se golpea el bal�n.
	public double getFuerza()
	{
		return _d_fuerza;
	}
	
	// Determina que la mejor acci�n posible es un pase.
	public void PasarBalon(Posicion a_pos_destino)
	{
		if ( _accion == AccionConBalon.NINGUNA )
		{
			_accion = AccionConBalon.PASE;
			_pos_destino = a_pos_destino;
		}
		else if ( _accion == AccionConBalon.PASE )
		{
			// Calculamos la distancia de la posici�n anteriormente almacenada
			//  y la posici�n que nos dan ahora. La m�s cercana al arco rival
			//  ser� la mejor opci�n.
			
			double d_dist_pos_anterior_al_cuad =
				Utilidades.DistanciaAlCuadrado(_pos_destino, Constantes.centroArcoSup);
			
			double d_dist_pos_actual_al_cuad =
				Utilidades.DistanciaAlCuadrado(a_pos_destino, Constantes.centroArcoSup);
			
			if ( d_dist_pos_actual_al_cuad < d_dist_pos_anterior_al_cuad )
				_pos_destino = a_pos_destino;
		}
	}
	
	// Determina que la mejor acci�n posible es un disparo al arco rival.
	public void ChutarBalon( Posicion a_pos_destino, double ad_angulo )
	{
		_accion = AccionConBalon.DISPARO;
		_pos_destino = a_pos_destino;
		_d_angulo = ad_angulo;
	}

	// Determina que la mejor acci�n posible es avanzar con el bal�n en los pies.
	public void AvanzarConBalon( double ad_angulo_avance )
	{
		_accion = AccionConBalon.AVANZAR_CON_BALON;
		_d_angulo_avance = ad_angulo_avance;
	}
	
	// Determina que la mejor acci�n posible es despejar el bal�n.
	public void Despeje( Posicion a_pos_destino, double ad_fuerza )
	{
		_accion = AccionConBalon.DESPEJE;
		_pos_destino = a_pos_destino;
		_d_angulo = 45.0;
		_d_fuerza = ad_fuerza;
		if ( _d_fuerza > 1 )
			_d_fuerza = 1;
		else if ( _d_fuerza < 0 )
			_d_fuerza = 0;
	}
	
}
